package initconf

import (
	"fmt"
	"log"

	"github.com/spf13/viper"
)

// 这里返回是这个类型的指针 使用大写定义为全局的 小写只能再一个包下使用
var Conf = new(appConfig)

// 需要大写才能赋值进去,最终丢到其他的方法中赋值,再其他的包中小写的没有权限的
type appConfig struct {
	Mode        string       `mapstructure:"mode"`
	Port        int          `mapstructure:"port"`
	Name        string       `mapstructure:"name"`
	Version     string       `mapstructure:"version"`
	LogConfig   *logConfig   `mapstructure:"log"`
	MySQLConfig *mySQLConfig `mapstructure:"mysql"`
	RedisConfig *redisConfig `mapstructure:"redis"`
}

type mySQLConfig struct {
	Host         string `mapstructure:"host"`
	User         string `mapstructure:"user"`
	Password     string `mapstructure:"password"`
	DBName       string `mapstructure:"dbname"`
	Timeout      string `mapstructure:"timeout"`
	Port         int    `mapstructure:"port"`
	MaxOpenConns int    `mapstructure:"max_open_conns"`
	MaxIdleConns int    `mapstructure:"max_idle_conns"`
}

type redisConfig struct {
	Host         string `mapstructure:"host"`
	Password     string `mapstructure:"password"`
	Port         int    `mapstructure:"port"`
	DBName       int    `mapstructure:"dbname"`
	Timeout      string `mapstructure:"timeout"`
	PoolSize     int    `mapstructure:"pool_size"`
	MinIdleConns int    `mapstructure:"min_idle_conns"`
}

type logConfig struct {
	Filename   string `mapstructure:"filename"`
	FilePath   string `mapstructure:"file_path"`
	MaxSize    int    `mapstructure:"max_size"`
	MaxAge     int    `mapstructure:"max_age"`
	MaxBackups int    `mapstructure:"max_backups"`
	Formatter  string `mapstructure:"formatter"` // JSON,TEXT
	Level      string `mapstructure:"level"`     // DEBUG,INFO,WARN,ERROR
}

func InitConf() {
	// 支持多种类型
	// 读取配置文件名字（不带后缀）指定读取哪个配置 方法里面包装了一个Viper指针 想要多去多个配置需要自己new一个新的Viper指针
	viper.SetConfigName("base_config")
	// 第一个搜索路径
	viper.AddConfigPath("./conf")
	//viper.AddConfigPath("/workspace/appName1") // 可以多次调用添加路径
	//viper.AddConfigPath(".")                   // 比如添加当前目录
	// 搜索路径，并读取配置数据
	err := viper.ReadInConfig()
	if err != nil {
		log.Println("读取配置文件错误", err)
	}
	err = viper.Unmarshal(Conf)
	if err != nil {
		panic(fmt.Errorf("unmarshal to Conf failed, err:%v", err))
	}
	// 读取第二个配置
	v2 := viper.New()
	v2.SetConfigName("config-" + Conf.Mode)
	v2.AddConfigPath("./conf")
	err = v2.ReadInConfig()
	if err != nil {
		log.Println("读取配置文件错误", err)
	}
	err = v2.Unmarshal(Conf)
	if err != nil {
		panic(fmt.Errorf("unmarshal to Conf failed, err:%v", err))
	}
}
